home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / arc42s.lbr / ARCSVC.MQC / arcsvc.mac
Text File  |  1985-08-04  |  7KB  |  155 lines

  1. /*  ARC - Archive utility - ARCSVC
  2.  
  3. $define(tag,$$segment(@1,$$index(@1,=)+1))#
  4. $define(version,Version $tag(
  5. TED_VERSION DB =2.06), created on $tag(
  6. TED_DATE DB =05/07/85) at $tag(
  7. TED_TIME DB =11:29:32))#
  8. $undefine(tag)#
  9.     $version
  10.  
  11. (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  12.  
  13.     By:  Thom Henderson
  14.  
  15.     Description:
  16.          This file contains service routines needed to maintain an archive.
  17.  
  18.     Language:
  19.          Computer Innovations Optimizing C86
  20. */
  21. #include <stdio.h>
  22. #include "arc.h"
  23.  
  24. openarc(chg)                           /* open archive */
  25. int chg;                               /* true to open for changes */
  26. {
  27.     char buf[$strlen];                 /* input buffer */
  28.     FILE *fopen();                     /* file opener */
  29.  
  30.     if(chg)                            /* if opening for changes */
  31.     {    if(bak=fopen(bakname,"rb"))   /* if old copy exists */
  32.          {    fclose(bak); bak = NULL;
  33.               printf("WARNING: Backup copy %s exists!",bakname);
  34.               while(1)
  35.               {    printf("  Delete it (y/n)? ");
  36.                    fgets(buf,$strlen,stdin);
  37.                    *buf = toupper(*buf);
  38.                    if(*buf=='Y' || *buf=='N')
  39.                         break;
  40.               }
  41.               if(*buf=='N')
  42.                    abort("Old backup not deleted");
  43.               unlink(bakname);         /* delete outdated backup */
  44.          }
  45.  
  46.          if(arc=fopen(arcname,"rb"))   /* if current archive exists */
  47.          {    fclose(arc);
  48.               if(rename(arcname,bakname))
  49.                    abort("Cannot rename %s to %s",arcname,bakname);
  50.               if(!(bak=fopen(bakname,"rb")))
  51.                    abort("Cannot open renamed archive: %s",bakname);
  52.               if(!(arc=fopen(arcname,"wb")))
  53.                    abort("Cannot create new archive: %s",arcname);
  54.          }
  55.          else
  56.          {    printf("Creating new archive: %s\n",arcname);
  57.               if(!(arc=fopen(arcname,"ab")))
  58.                    abort("Cannot create archive: %s",arcname);
  59.          }
  60.     }
  61.  
  62.     else                               /* open for no changes */
  63.     {    if(!(arc=fopen(arcname,"rb")))
  64.               abort("Cannot read archive: %s",arcname);
  65.     }
  66. }
  67.  
  68. closearc(chg)                          /* close an archive */
  69. int chg;                               /* true if archive was changed */
  70. {
  71.     if(chg)                            /* if archive was changed */
  72.     {    if(bak)                       /* then if we had a backup */
  73.               fclose(bak);             /* then close backup copy */
  74.          if(!keepbak)                  /* delete backup if desired */
  75.               unlink(bakname);
  76.          setstamp(arc,arcdate,arctime);/* archive matches newest file */
  77.     }
  78.  
  79.     fclose(arc);                       /* close the archive */
  80. }
  81.  
  82. int match(n,t)                         /* test name against template */
  83. char *n;                               /* name to test */
  84. char *t;                               /* template to test against */
  85. {
  86.     upper(n); upper(t);                /* avoid case problems */
  87.  
  88.     while(*n || *t)
  89.     {    if(*n!=*t && *t!='?')         /* match fail? */
  90.          {    if(*t!='*')              /* wildcard fail? */
  91.                    return 0;           /* then no match */
  92.               else                     /* else jump over wildcard */
  93.               {    while(*n && *n!='.')
  94.                         n++;
  95.                    while(*t && *t!='.')
  96.                         t++;
  97.               }
  98.          }
  99.          else                          /* match good for this char */
  100.          {    n++;                     /* advance to next char */
  101.               t++;
  102.          }
  103.     }
  104.     return 1;                          /* match worked */
  105. }
  106.  
  107. /* CRC computation logic
  108.  
  109.    The logic for this method of calculating the CRC 16 bit polynomial
  110.    is taken from an article by David Schwaderer in the April 1985
  111.    issue of PC Tech Journal.
  112. */
  113.  
  114. static int crctab[] =                  /* CRC lookup table */
  115. {   0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
  116.     0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
  117.     0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
  118.     0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
  119.     0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
  120.     0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
  121.     0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
  122.     0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
  123.     0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
  124.     0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
  125.     0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
  126.     0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
  127.     0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
  128.     0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
  129.     0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
  130.     0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
  131.     0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
  132.     0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
  133.     0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
  134.     0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
  135.     0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
  136.     0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
  137.     0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
  138.     0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
  139.     0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
  140.     0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
  141.     0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
  142.     0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
  143.     0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
  144.     0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
  145.     0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
  146.     0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
  147. };
  148.  
  149. int addcrc(crc,c)                      /* update a CRC check */
  150. int crc;                               /* running CRC value */
  151. unsigned char c;                       /* character to add */
  152. {
  153.     return ((crc>>8)&0x00ff) ^ crctab[(crc^c)&0x00ff];
  154. }
  155.